package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	"log"
)

// check 权限检查函数
// 功能：验证指定用户对特定资源是否有操作权限
// 参数：
//   - e: Casbin执行器实例，用于权限验证
//   - sub: 主体（用户或角色）
//   - obj: 资源对象（如URL路径）
//   - act: 操作类型（如GET、POST等）
func check(e *casbin.Enforcer, sub, obj, act string) {
	// 使用Casbin执行器进行权限验证
	// Enforce方法返回布尔值表示权限检查结果
	ok, _ := e.Enforce(sub, obj, act)

	// 根据权限检查结果输出相应信息
	if ok {
		// 权限允许：输出用户可以执行操作
		fmt.Printf("%s CAN %s %s\n", sub, act, obj)
	} else {
		// 权限拒绝：输出用户不能执行操作
		fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
	}
}

// main 程序主入口
// 功能：演示Casbin基本权限控制的使用方法
func main() {
	// 初始化Casbin权限执行器
	// 加载模型文件(model.pml)和策略文件(policy.csv)
	// 模型文件定义权限控制逻辑，策略文件定义具体权限规则
	e, err := casbin.NewEnforcer("./model.pml", "./policy.csv")
	if err != nil {
		// 如果初始化失败，记录错误并终止程序
		log.Fatalf("NewEnforcer failed:%v\n", err)
	}

	// 检查不同用户的权限访问
	// 演示基础权限验证功能
	check(e, "zhangsan", "/index", "GET")  // 检查张三是否有权限GET访问/index
	check(e, "zhangsan", "/home", "GET")   // 检查张三是否有权限GET访问/home
	check(e, "zhangsan", "/users", "POST") // 检查张三是否有权限POST访问/users

	// 动态权限管理演示
	// 为指定用户添加权限规则
	e.AddPolicy("wangwu", "/users", "POST")

	// 保存策略更改到持久化存储（当前注释掉，避免频繁写入）
	// e.SavePolicy()

	// 删除指定用户的权限规则（当前注释掉，仅作演示）
	// e.RemovePolicy("wangwu", "/users", "POST")

	// 验证动态添加的权限
	check(e, "wangwu", "/users", "POST") // 检查王五是否有权限POST访问/users
}
